/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Cliente;
import br.com.sysdrive.model.Montadora;
import br.com.sysdrive.model.Veiculo;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rodrigo
 */
public class VeiculoDAOImpl implements GenericDAO {

    private Connection conn;
    private ResultSet rs;

    public VeiculoDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com Sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    @Override
    public Boolean cadastrar(Object object) {
        PreparedStatement stmt = null;
        Veiculo veiculo = (Veiculo) object;
        String sql = "insert into veiculo (tipo_veiculo, chassi_veiculo, placa_veiculo, modelo_veiculo, ano_veiculo, cor_veiculo, status_veiculo, id_montadora, id_cliente) values (?,?,?,?,?,?,?,?,?);";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, veiculo.getTipoVeiculo().toUpperCase());
            stmt.setString(2, veiculo.getChassiVeiculo().toUpperCase());
            stmt.setString(3, veiculo.getPlacaVeiculo().toUpperCase());
            stmt.setString(4, veiculo.getModeloVeiculo().toUpperCase());
            stmt.setInt(5, veiculo.getAnoVeiculo());
            stmt.setString(6, veiculo.getCorVeiculo().toUpperCase());
            stmt.setString(7, veiculo.getStatusVeiculo().toUpperCase());
            stmt.setInt(8, veiculo.getMontadora().getIdMontadora());
            stmt.setInt(9, veiculo.getCliente().getIdCliente());
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao cadastrar Veiculo! Erro VeiculoDAO: " + ex.getMessage());
            ex.printStackTrace();
            return false;
        } catch (Exception ex) {
            System.out.println("Problemas ao cadastrar Veiculo! Erro VeiculoDAO: " + ex.getMessage());
            ex.printStackTrace();
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro VeiculoDAO: ");
            }
        }
    }

    @Override
    public List<Object> listar() {
        List<Object> resultado = new ArrayList<Object>();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select v.*, m.nome_montadora "
                + "from veiculo v, montadora m "
                + "where v.id_montadora = m.id_montadora;";
        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Veiculo veiculo = new Veiculo();
                veiculo.setIdVeiculo(rs.getInt("id_veiculo"));
                veiculo.setTipoVeiculo(rs.getString("tipo_veiculo"));
                veiculo.setChassiVeiculo(rs.getString("chassi_veiculo"));
                veiculo.setPlacaVeiculo(rs.getString("placa_veiculo"));
                veiculo.setModeloVeiculo(rs.getString("modelo_veiculo"));
                veiculo.setAnoVeiculo(rs.getInt("ano_veiculo"));
                veiculo.setCorVeiculo(rs.getString("cor_veiculo"));
                veiculo.setStatusVeiculo(rs.getString("status_veiculo"));

                Montadora montadora = new Montadora();
                montadora.setIdMontadora(rs.getInt("id_montadora"));
                montadora.setNomeMontadora(rs.getString("nome_montadora"));

                veiculo.setMontadora(montadora);

                resultado.add(veiculo);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao listar Veículo! Erro: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas no Servlet ao listar Veiculo! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return resultado;
    }

    @Override
    public Object carregar(int idObject) {
        Veiculo veiculo = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select v.* from veiculo v where id_veiculo = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();
            while (rs.next()) {
                veiculo = new Veiculo();
                veiculo.setIdVeiculo(rs.getInt("id_veiculo"));
                veiculo.setTipoVeiculo(rs.getString("tipo_veiculo"));
                veiculo.setChassiVeiculo(rs.getString("chassi_veiculo"));
                veiculo.setPlacaVeiculo(rs.getString("placa_veiculo"));
                veiculo.setModeloVeiculo(rs.getString("modelo_veiculo"));
                veiculo.setAnoVeiculo(rs.getInt("ano_veiculo"));
                veiculo.setCorVeiculo(rs.getString("cor_veiculo"));
                veiculo.setStatusVeiculo(rs.getString("status_veiculo"));

                Montadora montadora = new Montadora();
                montadora.setIdMontadora(rs.getInt("id_montadora"));

                veiculo.setMontadora(montadora);
            }
            return veiculo;
        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Veiculo! Erro: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Carrgar: ");
                ex.printStackTrace();
            }
        }
    }

    @Override
    public Boolean alterar(Object object) {
        Veiculo veiculo = (Veiculo) object;
        PreparedStatement stmt = null;
        String sql = "update veiculo set "
                + "tipo_veiculo = ?, chassi_veiculo=?, placa_veiculo=?, modelo_veiculo=?, ano_veiculo=?, cor_veiculo=?, status_veiculo = ?, id_montadora=?, id_cliente = ? "
                + "where id_veiculo=?;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, veiculo.getTipoVeiculo().toUpperCase());
            stmt.setString(2, veiculo.getChassiVeiculo().toUpperCase());
            stmt.setString(3, veiculo.getPlacaVeiculo().toUpperCase());
            stmt.setString(4, veiculo.getModeloVeiculo().toUpperCase());
            stmt.setInt(5, veiculo.getAnoVeiculo());
            stmt.setString(6, veiculo.getCorVeiculo().toUpperCase());
            stmt.setString(7, veiculo.getStatusVeiculo().toUpperCase());
            stmt.setInt(8, veiculo.getMontadora().getIdMontadora());
            stmt.setInt(9, veiculo.getIdVeiculo());
            stmt.setInt(10, veiculo.getCliente().getIdCliente());
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao alterar Veículo! Erro VeiculoDAO: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro VeiculoDAO: " + ex.getMessage());
            }
        }
    }
}
